package com.zf.fastexcel.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.poifs.filesystem.FileMagic;

import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * Excel判断工具
 */
@Slf4j
public class ExcelJudgeUtils {
    public static final String XLS = "xls";
    public static final String XLSX = "xlsx";
    public static final Set<String> EXCEL_EXTENSION_SET = new HashSet<>(Arrays.asList(XLS, XLSX));

    /**
     * 根据文件名获取扩展名
     *
     * @param fileName 文件名
     */
    public static String getExtensionByFilename(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return "";
        }
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    /**
     * 通过魔数(文件头)获取 excel 文件的真正扩展名
     * @param inputStream 文件流，需要支持 mark/reset 操作，如 BufferedInputStream
     */
    public static String getExtensionByFileMagic(InputStream inputStream) {
        try {
            FileMagic fileMagic = FileMagic.valueOf(inputStream);
            if (Objects.equals(fileMagic, FileMagic.OLE2)) {
                return XLS;
            } else if (Objects.equals(fileMagic, FileMagic.OOXML)) {
                return XLSX;
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return "";
    }

    /**
     * 通过魔数(文件头) 判断是否是 excel 文件
     * @param inputStream 文件流，需要支持 mark/reset 操作，如 BufferedInputStream
     */
    public static boolean isExcel(InputStream inputStream) {
        return EXCEL_EXTENSION_SET.contains(getExtensionByFileMagic(inputStream));
    }


    /**
     * 通过文件名判断是否是 excel 文件
     */
    public static boolean isExcel(String filename) {
        return EXCEL_EXTENSION_SET.contains(getExtensionByFilename(filename));
    }


}
